package ongd.web;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import ongd.negocio.gestion.ControladorIndice;
import ongd.negocio.gestion.Indice;

/**
 * Clase que se encargará de editar una página.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class EditarPagina extends ABean {

    /**
     * Objeto de tipo ControladorIndice que nos servirá para realizar
     * las operacions necesarias con los indices.
     */
    private ControladorIndice contIndice;
    /**
     * Objeto de tipo indice que contiene el indice al que 
     * asociaremos la url
     */
    private Indice indiceAsociado;
    /**
     * Objeto de tipo String que va a contener el texto que guardaremos en un
     * fichero.
     */
    private String texto;
    /**
     * Objeto de tipo String que va a contener la dirección donde se 
     * va a guardar el fichero.
     */
    private String url;

    /**
     * Constructor de la clase.
     */
    public EditarPagina() {
        SesionBean sesion = getSesionBean();
        if (sesion.iniciadaSesion()) {
            contIndice = sesion.getControladorIndice();
            indiceAsociado = contIndice.buscarIndice(sesion.getStrVariable());
            if (indiceAsociado != null) {
                //Establezco la url
                url = "webapps\\AplicacionONGD\\paginas\\";
                //Leo el fichero correspondiente al indice asociado
                texto = leerFichero(url + indiceAsociado.getNombre() + ".html");
            }
        }
    }

    /**
     * Método que carga las variables iniciales tras elegir la página deseada.
     */
    @Override
    public void cargaInicial() {
    }

    /**
     * Método que guardará el fichero y le asociará al indice correspondiente.
     * @return null
     */
    public String terminar() {
        if (getSesionBean().iniciadaSesion()) {
            try {
                guardarFichero(url + indiceAsociado.getNombre() + ".html", texto);
                contIndice.annadirUrl(indiceAsociado, indiceAsociado.getNombre() + ".html");
                FacesContext.getCurrentInstance().getExternalContext().redirect("consultarPagina.xhtml");

            } catch (IOException ex) {
                Logger.getLogger(EditarPagina.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que guarda el fichero en la ruta seleccionada.
     * @param strNombreFichero Nombre que va a tener el fichero
     * @param strTexto Texto que contiene el fichero
     */
    private void guardarFichero(String strNombreFichero, String strTexto) {
        FileWriter fichero = null;
        PrintWriter pw = null;
        try {
            fichero = new FileWriter(strNombreFichero);
            pw = new PrintWriter(fichero);
            pw.println(strTexto);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != fichero) {
                    fichero.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    /**
     * Método que lee un fichero.
     * @param strNombreFichero Nombre del fichero a leer
     * @return Cadena con el contenido del fichero
     */
    private String leerFichero(String strNombreFichero) {
        if (getSesionBean().iniciadaSesion()) {
            String strPagina = "";
            File fichero = new File(strNombreFichero);
            if (fichero.exists()) {
                FileReader fr = null;
                BufferedReader bf = null;
                String strLinea = null;

                try {
                    fr = new FileReader(strNombreFichero);
                    bf = new BufferedReader(fr);
                    while ((strLinea = bf.readLine()) != null) {
                        strPagina += strLinea;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (null != fr) {
                            fr.close();
                        }
                    } catch (Exception e2) {
                        e2.printStackTrace();
                    }
                }
            }
            return strPagina;
        }
        return null;
    }

    /**
     * Método que devuelve el valor de la variable texto.
     * @return texto
     * @see #setTexto
     */
    public String getTexto() {
        return texto;
    }

    /**
     * Método que establece el valor de la variable texto.
     * @param texto Nuevo valor de la variable
     * @see #getTexto
     */
    public void setTexto(String texto) {
        this.texto = texto;
    }

    /**
     * Método que devuelve el valor de la variable contIndice.
     * @return contIndice
     * @see #setContIndice
     */
    public ControladorIndice getContIndice() {
        return contIndice;
    }

    /**
     * Método que establece el valor de la variable contIndice.
     * @param contIndice Nuevo valor de la variable
     * @see #getContIndice
     */
    public void setContIndice(ControladorIndice contIndice) {
        this.contIndice = contIndice;
    }

    /**
     * Método que devuelve el valor de la variable Indice.
     * @return indiceAsociado
     * @see #setIndiceAsociado
     */
    public Indice getIndiceAsociado() {
        return indiceAsociado;
    }

    /**
     * Método que establece el valor de la variable indiceAsociado.
     * @param indiceAsociado Nuevo valor de la variable
     * @see #getIndiceAsociado
     */
    public void setIndiceAsociado(Indice indiceAsociado) {
        this.indiceAsociado = indiceAsociado;
    }

    /**
     * Método que devuelve la dirección donde se va a guardar el fichero.
     * @return url
     * @see #setUrl
     */
    public String getUrl() {
        return url;
    }

    /**
     * Método que establece el valor de la variable donde se va a guardar el fichero.
     * @param url Nuevo valor de la variable
     * @see #getUrl
     */
    public void setUrl(String url) {
        this.url = url;
    }
}
